/* **************************************************************************
 * $OpenLDAP: /com/novell/sasl/client/ResponseAuth.java,v 1.3 2005/01/17 15:00:54 sunilk Exp $
 *
 * Copyright (C) 2002 Novell, Inc. All Rights Reserved.
 *
 * THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
 * TREATIES. USE, MODIFICATION, AND REDISTRIBUTION OF THIS WORK IS SUBJECT
 * TO VERSION 2.0.1 OF THE OPENLDAP PUBLIC LICENSE, A COPY OF WHICH IS
 * AVAILABLE AT HTTP://WWW.OPENLDAP.ORG/LICENSE.HTML OR IN THE FILE "LICENSE"
 * IN THE TOP-LEVEL DIRECTORY OF THE DISTRIBUTION. ANY USE OR EXPLOITATION
 * OF THIS WORK OTHER THAN AS AUTHORIZED IN VERSION 2.0.1 OF THE OPENLDAP
 * PUBLIC LICENSE, OR OTHER PRIOR WRITTEN CONSENT FROM NOVELL, COULD SUBJECT
 * THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY.
 ******************************************************************************/
package com.novell.sasl.client;

import java.util.*;
import org.apache.harmony.javax.security.sasl.*;

/**
 * Implements the ResponseAuth class used by the DigestMD5SaslClient mechanism
 */
class ResponseAuth {

	private String m_responseValue;

	ResponseAuth(byte[] responseAuth) throws SaslException {
		m_responseValue = null;

		DirectiveList dirList = new DirectiveList(responseAuth);
		try {
			dirList.parseDirectives();
			checkSemantics(dirList);
		} catch (SaslException e) {
		}
	}

	/**
	 * Checks the semantics of the directives in the directive list as parsed
	 * from the digest challenge byte array.
	 * 
	 * @param dirList
	 *            the list of directives parsed from the digest challenge
	 * 
	 * @exception SaslException
	 *                If a semantic error occurs
	 */
	void checkSemantics(DirectiveList dirList) throws SaslException {
		Iterator directives = dirList.getIterator();
		ParsedDirective directive;
		String name;

		while (directives.hasNext()) {
			directive = (ParsedDirective) directives.next();
			name = directive.getName();
			if (name.equals("rspauth"))
				m_responseValue = directive.getValue();
		}

		/* post semantic check */
		if (m_responseValue == null)
			throw new SaslException("Missing response-auth directive.");
	}

	/**
	 * returns the ResponseValue
	 * 
	 * @return the ResponseValue as a String.
	 */
	public String getResponseValue() {
		return m_responseValue;
	}
}
